home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
9-Digit Zip Code Directory
/
9-Digit Zip Code Directory (American Business Information) (ABIZIP-12).ISO
/
z4src.zip
/
BSTITLE.C
< prev
next >
Wrap
C/C++ Source or Header
|
1995-04-30
|
11KB
|
414 lines
//----------------------------------------------------------------------------
// MODULE DESCRIPTION
//
// Module: bstitle.c
// Title: Base library
// Notice: John M. Weeder
// Copyright (c) 1993. All rights reserved.
// This module contains proprietary information and should be
// treated as confidential.
//
//----------------------------------------------------------------------------
// MAINTENANCE HISTORY
//
// $Workfile$
// $Revision$
// $Author$
// $Date$
// $Log$
//
//----------------------------------------------------------------------------
// MODULE NARRATIVE
//
//
// This module contains .
//
// The code in this module should be written entirely in C.
// Do not use any C++ constructs.
//
// This module is portable to:
// DOS 3.X+
// MS Windows 3.X+
// MS Windows NT
// OS/2 2.X+
// OS/2 2.0 PM
// SCO UNIX.
//
// The following compilers are supported:
// MSC 6.0A
// MSC/C++ 7.0
// Borland C++ 3.1 for DOS
// Borland C++ 1.0 for OS/2 2.X
// SCO UNIX cc
//
//----------------------------------------------------------------------------
#include <bs.h>
//----------------------------------------------------------------------------
// Description: Display program title string and other information
// Parameters: pszRevision PVCS revision string.
// pcszDate Compilation date (use __DATE__ macro)
// pcszTime Compilation time (use __DATE__ macro)
// pcszName Program descrptive name.
// If null, name is read from configuration
// information structure.
// Default is NULL.
// Returns:
//----------------------------------------------------------------------------
VOID FN_E BaseTitle(PSZ pszRevision, PCSZ pcszDate, PCSZ pcszTime, PCSZ pcszName)
{
CHAR szFormat[512];
SIZET cb = 0;
PCSZ pcsz;
szFormat[cb] = '\0'; // Program name and version
pcsz = CfgGet(CFG_PROGRAM_NAME, NULL);
if (pcsz != NULL
&& pcsz[0]
&& stricmp(pcsz, CFG_PROGRAM_NAME_DFT) != 0)
pcszName = pcsz;
pcszName = pcszName == NULL ? CFG_PROGRAM_NAME_DFT: pcszName;
pcsz = CfgGet(CFG_VERSION, NULL);
cb += sprintf(szFormat + cb, "\n%s %s\n", pcszName, pcsz);
#if COMPILE_DEBUG
if (pszRevision) // Application name and PVCS revision
pszRevision = Revision(pszRevision);
else
pszRevision = "1.0";
cb += sprintf(szFormat + cb,
"%s v%s (%s)\n",
CommandLineAppName(),
pszRevision,
CommandLineAppPath());
if (pcszDate == NULL) // Compilation date/time
pcszDate = __DATE__;
if (pcszTime == NULL)
pcszTime = __TIME__;
cb += sprintf(szFormat + cb,
"Compiled on %s at %s.\n",
pcszDate, pcszTime);
pcsz = Version(NULL,NULL); // Operating system version
if (pcsz[0])
cb += sprintf(szFormat + cb, "%s\n", pcsz);
{ // Program size
LONG lProgram, lFree;
ProgramSize(&lProgram, &lFree);
cb += sprintf(szFormat + cb,
"%ld/%ld K free (%ld K)\n",
(LONG)K(lFree), (LONG)K(lFree + lProgram), (LONG)K(lProgram));
}
{
cb += sprintf(szFormat + cb,
"DEBUG mode is %s\n"
"LOGGING is %s, LOG LEVEL is %ld\n"
"SCREEN OUTPUT is %s, RUN LOG is %s\n",
(DebugMode() ? "enabled": "disabled"),
(LogEnabled() ? "enabled": "disabled"),
(LONG)LogGetLevel(),
(OutputScreen() ? "enabled": "disabled"),
(OutputRunLog() ? "enabled": "disabled"));
}
{ // Id/access code/serial number
PCSZ pcszId = CfgGet(CFG_PROGRAM_ID, NULL);
PCSZ pcszSerial = CfgGet(CFG_SERIAL_NO, NULL);
PCSZ pcszAccess = CfgGet(CFG_ACCESS, NULL);
cb += sprintf(szFormat + cb, "ID=%-8s SERIAL #=%-8s ACCESS=%-8s\n",
pcszId, pcszSerial, pcszAccess);
}
{
PCSZ pcszRegister = CfgGet(CFG_REGISTER, NULL);
if (pcszRegister && pcszRegister[0])
cb += sprintf(szFormat + cb, "Registered to: %s\n", pcszRegister);
}
#else
NOTUSED(pszRevision);
NOTUSED(pcszDate);
NOTUSED(pcszTime);
#endif
// Copyright
pcsz = CfgGet(CFG_COPYRIGHT, NULL);
if (pcsz[0])
cb += sprintf(szFormat + cb, "%s\n", pcsz);
#if OS_UNIX
strcat(szFormat, "/HELP for additional help.\n\n");
#else
strcat(szFormat, "/? or /HELP for additional help.\n\n");
#endif
Output(szFormat);
return ;
}
//----------------------------------------------------------------------------
// Description:
// Parameters:
// Returns:
//----------------------------------------------------------------------------
static VOID FN BaseTitleWrap(PSZ psz, SIZET cLen)
{
#define LINE_LEN (79)
BOOL fFirst = TRUE;
if (cLen >= LINE_LEN || psz == NULL || !psz[0])
{
Output("\n");
return ;
}
cLen = LINE_LEN - cLen; // Maximum line length
while (psz && psz[0])
{
CHAR szBuffer[80];
PSZ pszLf;
if (!fFirst) // Indent
Output("%*s", LINE_LEN - cLen, "");
pszLf = strchr(psz, '\n');
if (pszLf) // Copy up to next line feed
{
SIZET cLf = (SIZET)(pszLf - psz);
strnzcpy(szBuffer, psz, MIN(cLen + 1, cLf + 1));
}
else // Copy remainder of line
strnzcpy(szBuffer, psz, cLen + 1);
Output("%s\n", szBuffer); // Output line
// Next line
psz = pszLf ? pszLf + 1: pszLf;
fFirst = FALSE;
}
return ;
}
//----------------------------------------------------------------------------
// Description:
// Parameters:
// Returns: TRUE if successful, else exit because of invalid command
// line or help requested.
//----------------------------------------------------------------------------
BOOL FN_E BaseTitleHelp(PBS_CMDOPT pcmdoptUser, PCSZ pcszDesc, FLAG16 fs)
{
static BOOL fHelp = FALSE;
static BS_CMDOPT acmdoptHelp[] =
{
{ "HELP", (PVOID)&fHelp, CMDOPT_TRUE, "Display help."},
#if OS_UNIX==0
{ "?", (PVOID)&fHelp, CMDOPT_TRUE|CMDOPT_NO_DFT},
#endif
BS_CMDOPT_NULL
};
CHAR szOption[80];
CHAR szBuffer[80];
PBS_CMDOPT pcmdopt = NULL;
SIZET cOptions = 0;
SIZET cParms = 0;
SIZET cRequired = 0;
SIZET cEntries = 0;
SIZET i;
SIZET cWhich = 0;
SIZET cMax = 0;
CHAR szDefault[80];
fHelp = FALSE;
// Count local entries
for (i = 0; !NULOPT(acmdoptHelp + i); ++i)
{
if (BTEST(acmdoptHelp[i].fs, _CMDOPT_FILESPEC))
{
if (BTEST(acmdoptHelp[i].fs, CMDOPT_REQUIRED))
cRequired++;
cParms++;
}
else
cOptions++;
cEntries++;
}
if (pcmdoptUser) // Count user entries
{
for (i = 0; !NULOPT(pcmdoptUser + i); ++i)
{
if (BTEST(pcmdoptUser[i].fs, _CMDOPT_FILESPEC))
{
if (BTEST(pcmdoptUser[i].fs, CMDOPT_REQUIRED))
cRequired++;
cParms++;
}
else
cOptions++;
cEntries++;
}
} // Allocate local structure
pcmdopt = (PBS_CMDOPT)MemAllocZero((cEntries + 1) * sizeof(BS_CMDOPT));
if (pcmdopt == NULL)
{
ErrorNoMem();
fHelp = TRUE;
goto ERROR_EXIT;
}
cEntries = 0; // Copy to local structure
for (i = 0; !NULOPT(acmdoptHelp + i); ++i, cEntries++)
pcmdopt[cEntries] = acmdoptHelp[i];
for (i = 0; !NULOPT(pcmdoptUser + i); ++i, cEntries++)
pcmdopt[cEntries] = pcmdoptUser[i];
// Get maximum length of parm names
for (i = 0; !NULOPT(pcmdopt + i); ++i)
if (pcmdopt[i].psz)
{
SIZET cLen = strlen(pcmdopt[i].psz);
cMax = MAX(cMax, cLen);
}
cMax = MIN(30, MAX(cMax, 15));
// Process command line
if (pcmdopt)
{
if (!CommandLineProcess(pcmdopt, fs))
fHelp = TRUE;
cEntries = 0; // Transfer flags back
for (i = 0; !NULOPT(acmdoptHelp + i); ++i, cEntries++)
;
for (i = 0; !NULOPT(pcmdoptUser + i); ++i, cEntries++)
pcmdoptUser[i].fs = pcmdopt[cEntries].fs;
}
if (!fHelp) // No help needed, so exit
goto ERROR_EXIT; // I apologize for the goto!!!*/
Output("USAGE: %s ", CommandLineAppName());
if (cOptions)
Output( "[options] ");
if (cParms)
{
for (cWhich = i = 0; !NULOPT(pcmdopt + i); ++i)
{
if (BTEST(pcmdopt[i].fs, _CMDOPT_FILESPEC))
{
if (cWhich == cRequired)
{
SIZET j;
for (j = 0; j < cParms - cRequired; ++j)
Output("[");
}
++cWhich;
if (pcmdopt[i].psz)
Output("%s", pcmdopt[i].psz);
else
Output("parm%d", cWhich);
if (cWhich > cRequired)
Output("] ");
else
Output(" ");
}
}
}
Output("\n\n");
if (pcszDesc) // Print program description if
{ // requested!
Output("%s\n", pcszDesc);
Output("\n");
}
if (cParms) // Print help for parameters
{
Output("PARAMETERS:\n");
for (cWhich = i = 0; !NULOPT(pcmdopt + i); ++i)
{
if (BTEST(pcmdopt[i].fs, _CMDOPT_FILESPEC))
{
PSZ psz;
CHAR szName[20];
++cWhich;
if (pcmdopt[i].psz)
psz = pcmdopt[i].psz;
else
{
sprintf(szName, "parm%d", cWhich);
psz = szName;
}
sprintf(szBuffer, " %-*.*s ", cMax, cMax, psz);
Output("%s", szBuffer);
BaseTitleWrap(pcmdopt[i].pszDesc, strlen(szBuffer));
}
}
Output("\n");
}
if (cOptions) // Print help for options
{
Output("OPTIONS:\n");
for (cWhich = i = 0; !NULOPT(pcmdopt + i); ++i)
{
if (!BTEST(pcmdopt[i].fs, _CMDOPT_FILESPEC))
{
PSZ pszMod;
SIZET cLen;
szDefault[0] = '\0';
if (BTEST(pcmdopt[i].fs, (CMDOPT_BOOL|CMDOPT_SWITCH)))
{
if (pcmdopt[i].psz[0] == '?')
pszMod = "";
else if ((pcmdopt[i].fs & CMDOPT_TRUE) == CMDOPT_TRUE)
pszMod = "[-]";
else if ((pcmdopt[i].fs & CMDOPT_FALSE) == CMDOPT_FALSE)
pszMod = "[+]";
else
pszMod = "";
}
else if (BTEST(pcmdopt[i].fs, CMDOPT_NUMERIC))
{
Assert(pcmdopt[i].pv);
sprintf(szDefault, "Default is %ld", *(PLONG)pcmdopt[i].pv);
pszMod = "=nnn";
}
else if (BTEST(pcmdopt[i].fs, _CMDOPT_TEXT))
{
Assert(pcmdopt[i].pv);
sprintf(szDefault, "Default is '%s'", pcmdopt[i].pv);
pszMod = "='text'";
}
else
pszMod = "";
sprintf(szOption, "/%s%s", pcmdopt[i].psz, pszMod);
sprintf(szBuffer, " %-*.*s ", cMax, cMax, szOption);
Output("%s", szBuffer);
cLen = strlen(szBuffer);
BaseTitleWrap(pcmdopt[i].pszDesc, cLen);
if (szDefault[0]
&& !BTEST(pcmdopt[i].fs, CMDOPT_NO_DFT))
{
Output("%*s%-*.*s\n",
cLen, "",
LINE_LEN - cLen, LINE_LEN - cLen, szDefault);
}
}
}
Output("\n");
}
ERROR_EXIT:
if (pcmdopt)
MemFree(pcmdopt);
return !fHelp;
}
//----------------------------------------------------------------------------
//------------------------------- End of File --------------------------------
//----------------------------------------------------------------------------